#pragma once
namespace ECS
{
	template <class T>
	class Nullable
	{
	public:
		Nullable() : _hasValue(false) {};
		Nullable(const T& value) : _hasValue(true), _value(value) {}
		Nullable(std::nullptr_t value) : _hasValue(false) {}
		Nullable(const Nullable<T>& other) : _hasValue(other._hasValue)
		{
			if (_hasValue)
				_value = other._value;
		}

		bool hasValue() const { return _hasValue; }
		const T& value() const { assert(_hasValue); return _value; }

		operator const T&() const {
			assert(_hasValue);
			return _value;
		}
	protected:
		bool _hasValue;
		T _value;
	};
}